不知道大家有沒有過這樣的經驗,每次參加求活動拿到很多造型很醜的贈品,明明沒花錢買但又覺得丟掉或送人都怪怪的,沒花錢卻出現浪費跟可惜的感覺,久而久之房間就堆放許多雞肋但沒有用到的物品。
當物品被堆疊後就很容易被遺忘,當需要時又需要翻箱倒櫃去找,這就跟丟垃圾桶沒什麼區別。
你是否問過自己擁有什麼?
為了要擁有那些付出什麼?
追逐的人生換來那些什麼?
最後能帶走什麼?
五月天 What A Song
物品在經過選擇後而沒有辦法馬上拋棄的話,收納就會是重要的,收納能夠讓我們輕鬆地找到需要的東西,而不必花時間一層一層地尋找或者堆疊物品,接下來就讓我們從資料儲存的角度切入來看看收納的概念。
正規化(Normalization)要求將資料分散到不同的表格中,目的是確保資料的一致性、減少重複性,目標在提高資料管理的效率,但可能會導致複雜的查詢。
資料庫的過度正規化就像是極致的收納,然而極致收納可能導致在使用介面(UI)時變得不方便,因為 UI 通常需要將資料全部展示出來,這代表可能需要不斷地把櫃子的東西倒出來排好然後又把東西一層一層塞回去容量有限的抽屜關起來。
但欄位的原子化仍舊相當的重要,也就是讓欄位的值不能進一步分解,這有助於確保資料的單一性和結構的簡單性。
例如如果有一個名稱欄位,不應該包含姓名、姓氏,而應該將它們分開儲存。
姓名 | 課程 |
---|---|
小明 | "數學,物理(二),化學(一)" |
小華 | "英文,物理(一),化學(二)" |
姓名: "小明,小華"
課程: "數學,物理(二),化學(一)"
正規化會把課程內容再原子化分為兩個欄位
課程名稱: "數學,物理,化學"
課程代號: "一,二"
如果現在要找出所有化學課:
有符合原子化的 query: select * from 課程列表 where course_name = '物理'
沒符合原子化的 query: select * from 課程列表 where course like '化學%'
以上面的例子來說,原子化後可以看出效能的差異,但正規化再繼續做下去,多對多的關係再拆分就會需要更多資料表,當資料筆數變更多查詢的效能就會越差。
反正規化 (Denormalization) 可以將相關資料合併到一個表中,以減少查詢的複雜性,從而提高讀取效能,但可能會增加資料冗余和管理複雜性。
為了效能的反正規化,雖然沒遵守 3NF 但也需要仔細的設計和規劃,該做的原子化還是建議要做,不適當的使用可能會導致效能問題或資料管理上的困難。
是一種資料庫設計方法,它將所有不同種類的資料都存儲在一個資料表中,這種設計方法強調簡單性和可擴展性,特別適用於 NoSQL 資料庫。
在資料庫設計中需要仔細考慮應用的需求和性能要求
最終的選擇應該基於實際的情況,需要權衡資料一致性、性能和管理複雜性,實作上也可以混合使用這些解決方案,以滿足不同類型的資料和查詢需求。